using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Globalization;
using System.IO;
using System.Text;
using Microsoft.SqlServer.Server;

public partial class IzvodProcedure
{


    [SqlFunction(FillRowMethodName = "FillRow2", DataAccess = DataAccessKind.Read, Name = "PretvoriURedove", TableDefinition = "Vrijednost sql_variant")]
    public static IEnumerable InitMethod2(SqlString Kolekcija, SqlString delimiter)
    {
        //string[] _testIds = IDs.ToString().Split(',');
        //int _testint = 0;
        //foreach (string _id in _testIds)
        //{
        //    if (!int.TryParse(_id, out _testint))
        //    {
        //        return null;
        //    }
        //}

        return new PretvoriuRedove(Kolekcija, delimiter);
    }
    public static void FillRow2(Object obj, out object Vrijednost)
    {
        object rowarr = obj;
        Vrijednost = rowarr;

    }
    public class PretvoriuRedove : IEnumerable
    {
        private SqlString _Kolekcija;
        private SqlString _delimiter;

        public PretvoriuRedove(SqlString Kolekcija, SqlString delimiter)
        {
            _Kolekcija = Kolekcija;
            _delimiter = delimiter;
        }


        #region IEnumerable Members

        public IEnumerator GetEnumerator()
        {
            return new TestEnumerator(this);
        }

        #endregion
        public class TestEnumerator : IEnumerator
        {
            private int prebroj = 0;
            private string[] _stringar = null;

            #region IEnumerator Members
            public TestEnumerator(PretvoriuRedove reader)
            {
                _stringar = reader._Kolekcija.ToString().Split(reader._delimiter.ToString()[0]);
                prebroj = _stringar.Length;
                Reset();
            }



            public object Current
            {
                get
                {
                    return _stringar[prebroj - 1];

                }
            }

            public bool MoveNext()
            {

                if (prebroj < _stringar.Length)
                {
                    prebroj += 1;
                    //current = new object[1];
                    //current[0] =  (SqlString)_enum.Current.Vlasnik;
                    return true;
                }
                else
                {

                    return false;
                }
            }

            public void Reset()
            {
                prebroj = 0;
            }

            #endregion
        }

    }




    [SqlFunction(FillRowMethodName = "FillRow", DataAccess = DataAccessKind.Read, Name = "StavkeIzvoda", TableDefinition = "Vlasnik NVARCHAR(70),Vlasnikziroracun nvarchar(70),BrojIzvatka int,BrojZaReklamaciju nvarchar(70),DatumTransakcije DateTime,Dug money,Pot money,Model nvarchar(2),Pozivnabr nvarchar(22),Opis nvarchar(140),VeznaOznaka nvarchar(2),VjerovnikDuznikNaziv nvarchar(70),VjerovnikDuznikZiroracun nvarchar(70),RedBrStavke int")]
    public static IEnumerable InitMethod(SqlString IDs)
    {
        string[] _testIds = IDs.ToString().Split(',');
        int _testint = 0;
        foreach (string _id in _testIds)
        {
            if (!int.TryParse(_id, out _testint))
            {
                return null;
            }
        }

        return new StavkeIzvadaka(IDs);
    }


    public static void FillRow(Object obj, out SqlString Vlasnik, out SqlString VlasnikZiroracun, out SqlInt32 BrojIzvatka, out SqlString BrojZaReklamaciju
        , out SqlDateTime DatumTransakcije, out SqlMoney Dug, out SqlMoney Pot, out SqlString Model, out SqlString Pozivnabr
        , out SqlString Opis, out SqlString VeznaOznaka, out SqlString VjerovnikDuznikNaziv, out SqlString VjerovnikDuznikZiroracun
        , out SqlInt32 RedBrStavke)
    {
        PretvoreneStavkeIzvatka rowarr = (PretvoreneStavkeIzvatka)obj;
        BrojZaReklamaciju = (SqlString)rowarr.BrojZaReklamaciju;
        BrojIzvatka = rowarr.BrojIzvatka;
        DatumTransakcije = rowarr.DatumTransakcije;
        Dug = rowarr.Dug;
        Pot = rowarr.Pot;
        Model = (SqlString)rowarr.Model;
        Pozivnabr = (SqlString)rowarr.Pozivnabr;
        Opis = (SqlString)rowarr.Opis;
        VeznaOznaka = (SqlString)rowarr.Veznaoznaka;
        VjerovnikDuznikNaziv = (SqlString)rowarr.VjerovnikDuznikNaziv;
        VjerovnikDuznikZiroracun = (SqlString)rowarr.VjerovnikDuznikZiroracun;
        VlasnikZiroracun = (SqlString)rowarr.Vlasnikziroracun;
        Vlasnik = (SqlString)(rowarr.Vlasnik);
        RedBrStavke = rowarr.RedBrStavke;

    }
    public class StavkeIzvadaka : IEnumerable
    {
        private readonly PretvoreneStavkeIzvatkaList outlista = new PretvoreneStavkeIzvatkaList();
        public StavkeIzvadaka(INullable IDs)
        {
            if (IDs.IsNull) return;
            SqlConnection cn = new SqlConnection("Context Connection=true");
            SqlCommand cmd = new SqlCommand("select Datoteka from fin.tblIzvadak where ID in (" + IDs + ")", cn);
            SqlDataReader rdr;
            cn.Open();
            bool Valid = true;
            rdr = cmd.ExecuteReader();
            // SqlMetaData colData = new SqlMetaData("Datoteka",SqlDbType.VarBinary,8000);
            //  SqlDataRecord r = new SqlDataRecord(new SqlMetaData[] {colData});
            //  SqlContext.Pipe.SendResultsStart(r);
            while (rdr.Read())
            {
                Byte[] _datoteka = (byte[])rdr["Datoteka"];
                KreirajListu(_datoteka, ref Valid, ref outlista);

                //    r.SetBytes(0,0,_datoteka,0,_datoteka.Length-1);

                //     SqlContext.Pipe.SendResultsRow(r);
            }
            //  SqlContext.Pipe.SendResultsEnd();

            //if (Valid)
            //    {
            //        PosaljinaSQL(outlista);
            //    }
        }
        #region IEnumerable Members

        protected internal string[] _str = { "" };

        public IEnumerator GetEnumerator()
        {
            return new TestEnumerator(this);
        }

        #endregion
        public class TestEnumerator : IEnumerator
        {
            private readonly StavkeIzvadaka _test;
            private readonly IEnumerator<PretvoreneStavkeIzvatka> _enum = null;
            #region IEnumerator Members
            public TestEnumerator(StavkeIzvadaka reader)
            {
                _test = reader;
                _enum = _test.outlista.GetEnumerator();
                Reset();
            }



            public object Current
            {
                get
                {
                    if (_enum != null)
                        return _enum.Current;
                    else
                    {
                        return null;
                    }
                }
            }

            public bool MoveNext()
            {

                if (_enum.MoveNext())
                {
                    ;
                    //current = new object[1];
                    //current[0] =  (SqlString)_enum.Current.Vlasnik;
                    return true;
                }
                else
                {

                    return false;
                }
            }

            public void Reset()
            {
                if (_enum != null)
                    _enum.Reset();
            }

            #endregion
        }



    }

    [SqlProcedure]
    public static void _StavkeIzvoda_GetStavkeBytblIzvodIDs(SqlString IDs)
    {
        if (IDs.IsNull) return;
        ;
        string[] _testIds = IDs.ToString().Split(',');
        int _testint = 0;
        foreach (string _id in _testIds)
        {
            if (!int.TryParse(_id, out _testint))
            {
                return;
            }
        }

        SqlConnection cn = new SqlConnection("Context Connection=true");
        SqlCommand cmd = new SqlCommand("select Datoteka from fin.tblIzvadak where ID in (" + IDs.ToString() + ")", cn);
        SqlDataReader rdr;
        cn.Open();
        PretvoreneStavkeIzvatkaList outlista = new PretvoreneStavkeIzvatkaList();
        bool Valid = true;
        rdr = cmd.ExecuteReader();
        // SqlMetaData colData = new SqlMetaData("Datoteka",SqlDbType.VarBinary,8000);
        //  SqlDataRecord r = new SqlDataRecord(new SqlMetaData[] {colData});
        //  SqlContext.Pipe.SendResultsStart(r);
        while (rdr.Read())
        {
            Byte[] _datoteka = (byte[])rdr["Datoteka"];
            KreirajListu(_datoteka, ref Valid, ref outlista);

            //    r.SetBytes(0,0,_datoteka,0,_datoteka.Length-1);

            //     SqlContext.Pipe.SendResultsRow(r);
        }
        //  SqlContext.Pipe.SendResultsEnd();
        if (Valid)
        {
            PosaljinaSQL(outlista);
        }
        rdr.Close();
        cn.Close();
    }

    private static void PosaljinaSQL(PretvoreneStavkeIzvatkaList outlista)
    {
        SqlMetaData colVlasnik = new SqlMetaData("Vlasnik", SqlDbType.NVarChar, 70);
        SqlMetaData colVlasnikziroracun = new SqlMetaData("Vlasnikziroracun", SqlDbType.NVarChar, 70);
        SqlMetaData colBrojIzvatka = new SqlMetaData("BrojIzvatka", SqlDbType.Int);
        SqlMetaData colBrojZaReklamaciju = new SqlMetaData("BrojZaReklamaciju", SqlDbType.NVarChar, 70);
        SqlMetaData colDatumTransakcije = new SqlMetaData("DatumTransakcije", SqlDbType.DateTime);
        SqlMetaData colDug = new SqlMetaData("Dug", SqlDbType.Money);
        SqlMetaData colPot = new SqlMetaData("Pot", SqlDbType.Money);
        SqlMetaData colModel = new SqlMetaData("Model", SqlDbType.NVarChar, 2);
        SqlMetaData colPozivnabr = new SqlMetaData("Pozivnabr", SqlDbType.NVarChar, 22);
        SqlMetaData colOpis = new SqlMetaData("Opis", SqlDbType.NVarChar, 140);
        SqlMetaData colVeznaOznaka = new SqlMetaData("VeznaOznaka", SqlDbType.NVarChar, 2);
        SqlMetaData colVjerovnikDuznikNaziv = new SqlMetaData("VjerovnikDuznikNaziv", SqlDbType.NVarChar, 70);
        SqlMetaData colVjerovnikDuznikZiroracun = new SqlMetaData("VjerovnikDuznikZiroracun", SqlDbType.NVarChar, 70);
        SqlMetaData colRedBrStavke = new SqlMetaData("RedBrStavke", SqlDbType.Int);
        SqlDataRecord r = new SqlDataRecord(new SqlMetaData[] { colVlasnik, colVlasnikziroracun, colBrojIzvatka,
        colBrojZaReklamaciju,colDatumTransakcije,colDug,colPot,colModel,colPozivnabr,colOpis,colVeznaOznaka
        ,colVjerovnikDuznikNaziv,colVjerovnikDuznikZiroracun,colRedBrStavke});

        SqlContext.Pipe.SendResultsStart(r);
        for (int i = 0; i < outlista.Count; i++)
        {
            r.SetString(0, outlista[i].Vlasnik ?? String.Empty);
            r.SetString(1, outlista[i].Vlasnikziroracun ?? String.Empty);
            r.SetInt32(2, outlista[i].BrojIzvatka);
            r.SetString(3, outlista[i].BrojZaReklamaciju ?? String.Empty);
            r.SetDateTime(4, outlista[i].DatumTransakcije);
            r.SetDecimal(5, outlista[i].Dug);
            r.SetDecimal(6, outlista[i].Pot);
            r.SetString(7, outlista[i].Model ?? String.Empty);
            r.SetString(8, outlista[i].Pozivnabr ?? String.Empty);
            r.SetString(9, outlista[i].Opis ?? String.Empty);
            r.SetString(10, outlista[i].Veznaoznaka ?? String.Empty);
            r.SetString(11, outlista[i].VjerovnikDuznikNaziv ?? String.Empty);
            r.SetString(12, outlista[i].VjerovnikDuznikZiroracun ?? String.Empty);
            r.SetSqlInt32(13, outlista[i].RedBrStavke);
            SqlContext.Pipe.SendResultsRow(r);
        }
        SqlContext.Pipe.SendResultsEnd();

    }

    // static readonly Encoding encoding = Encoding.GetEncoding("Windows-1250");

   
    static readonly CultureInfo provider = CultureInfo.InvariantCulture;
    static void KreirajListu(byte[] bytelista, ref bool Valid, ref PretvoreneStavkeIzvatkaList outlista)
    {
        
        //   if ((bytelista[0] == 0xef && bytelista[1] == 0xbb && bytelista[2] == 0xbf) || // utf-8 
        //(bytelista[0] == 0xff && bytelista[1] == 0xfe) || // ucs-2le, ucs-4le, and ucs-16le 
        //(bytelista[0] == 0xfe && bytelista[1] == 0xff) || // utf-16 and ucs-2 
        //(bytelista[0] == 0 && bytelista[1] == 0 && bytelista[2] == 0xfe && bytelista[3] == 0xff)) // ucs-4 
        //   {
        //       encoding = Encoding.UTF8;
        //       PretvoreneStavkeIzvatka _test = new PretvoreneStavkeIzvatka();
        //       _test.Opis = "prvi";
        //       outlista.Add(_test);
        //   }
        //   else
        //   {
        //       encoding = Encoding.GetEncoding("Windows-1250");
        //   }
        MemoryStream filename = new MemoryStream(bytelista);
        PretvoreneStavkeIzvatkaList _lista = new PretvoreneStavkeIzvatkaList();

        Encoding encoding = new UTF8Encoding();
        TextReader tr = new StreamReader(filename, encoding);
        //TextReader tr = new StreamReader(_stream,  encoding);
        //   tr.ReadLine();
        bool noviformat = false;
        string linetest;
        int br = 0;
        try
        {
            if ((linetest = tr.ReadLine()) != null)
            {
                if (linetest.Substring(linetest.Length - 1, 1) != "3" || linetest.Substring(linetest.Length - 3, 3) != "903")
                {
                    if (linetest.Substring(linetest.Length-3,3)== "900")
                    {
                        noviformat = true;
                    }
                    linetest = tr.ReadLine();
                }
                 if (linetest.Substring(linetest.Length-3,3)== "903")
                    {
                        noviformat = true;
                    }
                int testint = 0;
                DateTime _datum;
                int brojizvatkatest;

                if (linetest.Substring(linetest.Length - 1, 1) == "3" && linetest.Substring(linetest.Length - 3, 3) != "903")
                {
                    //
                    int.TryParse(linetest.Substring(0, 10), out testint);
                    int.TryParse(linetest.Substring(53, 3), out brojizvatkatest);
                    int.TryParse(linetest.Substring(114, 7), out testint);
                   
                    //ISPRAVAK
                    //DateTime.TryParse(
                    //    linetest.Substring(191, 2) + "." + linetest.Substring(193, 2) + "." + linetest.Substring(195, 4),
                    //    out _datum);
                    //DateTime.TryParse(linetest.Substring(191, 2) + "." + linetest.Substring(193, 2) + "." + linetest.Substring(195, 4),)
                    DateTime.TryParseExact(
                        linetest.Substring(191, 2) + "." + linetest.Substring(193, 2) + "." + linetest.Substring(195, 4),
                        "dd.MM.yyyy", provider, DateTimeStyles.None, out _datum);

                    int.TryParse(linetest.Substring(114, 7), out br);
                }
            }
            filename = null;
            tr = null;
            if (br == 2360000)
            {
                filename = new MemoryStream(bytelista);
                tr = new StreamReader(filename, encoding);
            }
            else
            {
                
                filename = new MemoryStream(bytelista);
                encoding = Encoding.GetEncoding("Windows-1250");
                tr = new StreamReader(filename, encoding);

            }
        }
        catch
        {
                filename = null;
            tr = null;
             filename = new MemoryStream(bytelista);
            tr = new StreamReader(filename, encoding);
        }
        // read a line of text
        int slog0;
        int slog3;
        int slog5;
        int slog5kroz;
        int slog7;
        int slog9;

        DateTime _datumizvoda = new DateTime();
        slog0 = 0;
        slog3 = 0;
        slog5 = 0;
        slog7 = 0;
        slog9 = 0;
        slog5kroz = 0;
        string transakcijskiracunvlasnika;
        string vlasnik;
        int brojizvatka = 0;
        vlasnik = string.Empty;
        transakcijskiracunvlasnika = string.Empty;

        string line;
        if (noviformat)
        {
             while ((line = tr.ReadLine()) != null && Valid && line.Length != 0)
            {
                //CheckWriteSlog0(line,ref slog0, ref Valid,ref _datumizvoda);
                CheckWriteSlog903(line, ref slog3, ref slog7, ref Valid, ref transakcijskiracunvlasnika, ref vlasnik,
                                ref brojizvatka, ref _datumizvoda);
                CheckWriteSlog905(line, _lista, ref slog3, ref slog5, ref slog7, ref Valid, ref transakcijskiracunvlasnika,
                                ref vlasnik, ref brojizvatka, ref _datumizvoda);
                CheckWriteSlog907(line, _lista, ref slog3, ref slog5, ref slog7, ref transakcijskiracunvlasnika,
                                ref _datumizvoda, ref vlasnik, ref brojizvatka, ref slog5kroz, ref Valid);
                //CheckWriteSlog9(line,ref slog3,ref slog7,ref slog0,ref slog9,ref slog5kroz,ref Valid);

            }
        }
        else
        {


            while ((line = tr.ReadLine()) != null && Valid && line.Length != 0)
            {
                //CheckWriteSlog0(line,ref slog0, ref Valid,ref _datumizvoda);
                CheckWriteSlog3(line, ref slog3, ref slog7, ref Valid, ref transakcijskiracunvlasnika, ref vlasnik,
                                ref brojizvatka, ref _datumizvoda);
                CheckWriteSlog5(line, _lista, ref slog3, ref slog5, ref slog7, ref Valid, ref transakcijskiracunvlasnika,
                                ref vlasnik, ref brojizvatka, ref _datumizvoda);
                CheckWriteSlog7(line, _lista, ref slog3, ref slog5, ref slog7, ref transakcijskiracunvlasnika,
                                ref _datumizvoda, ref vlasnik, ref brojizvatka, ref slog5kroz, ref Valid);
                //CheckWriteSlog9(line,ref slog3,ref slog7,ref slog0,ref slog9,ref slog5kroz,ref Valid);

            }
        }
        // close the stream
        if (Valid)
        {
            outlista.AddRange(_lista);
        }
        else
        {

            _lista.Clear();
        }
        tr.Close();
    }






    private static bool CheckWriteSlog0(string line, ref int slog0, ref bool Valid, ref DateTime _datumizvoda)
    {
        bool result = false;

        if (line.Substring(line.Length - 1, 1) == "0"
            //&& line.Substring(0, 5) == "00000"
            //&& line.Substring(5, 1) == " "
            //&& line.Substring(6, 1) == " "
            //&& !String.IsNullOrEmpty(line.Substring(7, 6))
            //&& line.Substring(13, 7) == "0000000" && line.Substring(20, 3) == "250"
            //&& line.Substring(23, 168) == "                                                                                                                                                                        "
            //&& !string.IsNullOrEmpty(line.Substring(191, 8))
            //&& DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4), out _datumizvoda)
            //&& line.Substring(199, 50) == "                                                  "
            )
        {
            //

            //ISPRAVAK
            //DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4),
            //                  out _datumizvoda);
            //
                             DateTime.TryParseExact(
                       line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4),
                        "dd.MM.yyyy", provider, DateTimeStyles.None, out _datumizvoda);

            //_datumizvoda = DateTime.Now;
            if (slog0 > 0)
            {
                Valid = false;
            }
            slog0 += 1;

            return true;
        }
        return result;
    }



    private static bool CheckWriteSlog3(string line, ref int slog3, ref int slog7, ref bool Valid, ref string transakcijskiracunvlasnika, ref string vlasnik, ref int brojizvatka, ref DateTime _datumizvoda)
    {
        bool result = false;
        int testint;
        DateTime _datum;

        if (line.Substring(line.Length - 1, 1) == "3"
            //&& int.TryParse(line.Substring(0, 10), out testint)
            //&& line.Substring(10, 8) == "        "
            ////&& line.Substring(63, 5) == "00000"
            ////&& line.Substring(71, 1) == " "
            ////&& line.Substring(106, 3) == "000"
            ////&& line.Substring(109, 2) == "  "
            ////&& line.Substring(111, 3) == "250"
            //&& line.Substring(121, 2) == "N "
            //&& int.TryParse(line.Substring(53, 3), out brojizvatka)
            //&& int.TryParse(line.Substring(114, 7), out testint)
            //&& DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4), out _datum)
            //&& line.Substring(199, 50) == "                                                  "
            )
        {
            //
            int.TryParse(line.Substring(0, 10), out testint);
            int.TryParse(line.Substring(53, 3), out brojizvatka);
            int.TryParse(line.Substring(114, 7), out testint);

            //ISPRAVAK
            //DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4),
            //                  out _datum);
            //

                    DateTime.TryParseExact(
                        line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4),
                        "dd.MM.yyyy", provider, DateTimeStyles.None, out _datum);
            
            if ((slog3 - slog7) == 0)
            {
                slog3 += 1;
                //transakcijskiracunvlasnika = line.Substring(114, 7) + "-" + line.Substring(0, 10);
                string _subs = line.Substring(0, 17);
                string _substring = _subs.Replace(line.Substring(114, 7), "");
                if (_substring.Length == 10)
                {
                    _subs = _substring.Substring(0, 10);
                }
                else
                {
                    _subs = line.Substring(0, 10).Substring(0, 10);
                }
                transakcijskiracunvlasnika = line.Substring(114, 7) + "-" + _subs;
                vlasnik = line.Substring(18, 35);
                vlasnik = vlasnik.TrimEnd(' ');

                _datumizvoda = _datum;

                result = true;
            }
            else
            {
                Valid = false;
            }

        }

        return result;
    }

    private static bool CheckWriteSlog5(string line, PretvoreneStavkeIzvatkaList lista, ref int slog3, ref int slog5, ref int slog7, ref bool Valid, ref string transakcijskiracunvlasnika, ref string vlasnik, ref int brojizvatka, ref DateTime _datumizvoda)
    {
        bool result = false;
        PretvoreneStavkeIzvatka _stavka = new PretvoreneStavkeIzvatka();
        DateTime _datumvalute;
        if (line.Substring(line.Length - 1, 1) == "5" && (slog3 - slog7) == 1
            //&& line.Substring(204, 6) == "100100"
            //&& DateTime.TryParse(line.Substring(210, 2) + "." + line.Substring(212, 2) + "." + line.Substring(214, 4), out _datumvalute)
            //&& line.Substring(218, 1) == " "
            )
        {
            //
            //ISPRAVAK
            //DateTime.TryParse(line.Substring(210, 2) + "." + line.Substring(212, 2) + "." + line.Substring(214, 4),
            //                  out _datumvalute);
                             DateTime.TryParseExact(
                        line.Substring(210, 2) + "." + line.Substring(212, 2) + "." + line.Substring(214, 4),
                        "dd.MM.yyyy", provider, DateTimeStyles.None, out _datumvalute);

          
            //_datumvalute = DateTime.Now;
            //
            decimal _predznak = 1m;
            if (line.Substring(248, 1) == "-")
            {
                _predznak = -1m;
            }
            else if (line.Substring(248, 1) == "+")
            {
                _predznak = 1m;
            }
            if (line.Substring(0, 2) == "10")
            {
                Decimal _decimal;
                if (Decimal.TryParse(string.Format("{0},{1}", (line.Substring(65, 11)), (line.Substring(76, 2))), NumberStyles.AllowDecimalPoint, new CultureInfo("hr-hr"), out _decimal))
                {
                    _stavka.Dug = _decimal * _predznak;
                }

            }
            else if (line.Substring(0, 2) == "20")
            {
                Decimal _decimal;
                if (Decimal.TryParse(string.Format("{0},{1}", (line.Substring(65, 11)), (line.Substring(76, 2))), NumberStyles.AllowDecimalPoint, new CultureInfo("hr-hr"), out _decimal))
                {
                    _stavka.Pot = _decimal * _predznak;
                }
            }
            else
            {
                Valid = false;
                return false;
            }
            _stavka.Vlasnikziroracun = transakcijskiracunvlasnika;
            _stavka.Vlasnik = vlasnik;
            _stavka.BrojIzvatka = brojizvatka;
            string _subs = line.Substring(2, 17);
            string _substring = _subs;
            if (_subs.Substring(0, 7) == line.Substring(197, 7))
            {
                _substring = _subs.Substring(7, _subs.Length - 7);
            }

            if (_substring.Length == 10)
            {
                _subs = _substring.Substring(0, 10);
            }
            else
            {
                _subs = line.Substring(2, 18).Substring(0, 10);
            }
            string vdzr = (line.Substring(197, 7) + "-" + _subs).Trim(' ');
            _stavka.VjerovnikDuznikZiroracun = vdzr == "-" ? String.Empty : vdzr;
            _stavka.VjerovnikDuznikNaziv = line.Substring(20, 35).TrimEnd(' ');
            _stavka.DatumTransakcije = _datumizvoda;
            if (_datumvalute < _datumizvoda)
            {
                // _datumizvoda = _datumvalute;
                _stavka.DatumTransakcije = _datumvalute;
            }


            _stavka.Model = line.Substring(102, 2).Trim(' ');
            _stavka.Pozivnabr = line.Substring(104, 22).Trim(' ');
            _stavka.Veznaoznaka = line.Substring(126, 2).Trim(' ');
            _stavka.Opis = line.Substring(128, 36).Trim(' ');
            _stavka.BrojZaReklamaciju = line.Substring(165, 32).Trim(' ');
            _stavka.RedBrStavke = slog5 + 1;
            lista.Add(_stavka);
            slog5 += 1;
            result = true;
        }

        return result;
    }
    private static bool CheckWriteSlog7(string line, PretvoreneStavkeIzvatkaList lista, ref int slog3, ref int slog5, ref int slog7, ref string transakcijskiracunvlasnika, ref DateTime _datumizvoda, ref string vlasnik, ref int brojizvatka
        , ref int slog5kroz, ref bool Valid)
    {
        bool result = false;
        DateTime _datum;
        int brojstavaka;
        int Rednibrojgrupe;

        if (line.Substring(line.Length - 1, 1) == "7" && (slog3 - slog7) == 1
            //    && line.Substring(132, 38) == "                                   000"
            //    && line.Substring(172, 3) == "   "
            //&& DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4), out _datum)
            //    && int.TryParse(line.Substring(126, 6), out brojstavaka)
            //    && int.TryParse(line.Substring(122, 4), out Rednibrojgrupe)
         )
        {
            //

            //ISPRAVAK
            //DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4),
            //                  out _datum);
            //_datum = DateTime.Now;

                   DateTime.TryParseExact(
                     line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4),
                        "dd.MM.yyyy", provider, DateTimeStyles.None, out _datum);

            int.TryParse(line.Substring(126, 6), out brojstavaka);
            int.TryParse(line.Substring(122, 4), out Rednibrojgrupe);
            //

            if (/*line.Substring(199, 7) + "-" + line.Substring(0, 10)*/
                //  line.Substring(199, 7) + "-" + (line.Substring(0, 17).Replace(line.Substring(199, 7), "")).Substring(0, 10) == transakcijskiracunvlasnika
                //  && 
                vlasnik == line.Substring(18, 35).TrimEnd(' ')
                && brojstavaka == slog5
                /*&& Rednibrojgrupe == slog3*/
                //  && _datum == _datumizvoda
                )
            {
                PretvoreneStavkeIzvatka _stavkad = new PretvoreneStavkeIzvatka();
                PretvoreneStavkeIzvatka _stavkap = new PretvoreneStavkeIzvatka();
                Decimal _decimal;
                int uutra = slog5;
                if (Decimal.TryParse(string.Format("{0},{1}", (line.Substring(77, 13)), (line.Substring(90, 2))), NumberStyles.AllowDecimalPoint, new CultureInfo("hr-hr"), out _decimal))
                {
                    if (_decimal != 0m)
                    {
                        _stavkad.Pot = _decimal;
                        _stavkad.Opis = "Promet D";
                        _stavkad.DatumTransakcije = _datumizvoda;
                        _stavkad.Vlasnik = vlasnik;
                        _stavkad.Vlasnikziroracun = transakcijskiracunvlasnika;
                        _stavkad.BrojIzvatka = brojizvatka;
                        uutra++;
                        _stavkad.RedBrStavke = uutra;
                        lista.Add(_stavkad);
                    }
                }

                if (Decimal.TryParse(string.Format("{0},{1}", (line.Substring(92, 13)), (line.Substring(105, 2))), NumberStyles.AllowDecimalPoint, new CultureInfo("hr-hr"), out _decimal))
                {
                    if (_decimal != 0m)
                    {
                        _stavkap.Dug = _decimal;
                        _stavkap.Opis = "Promet P";
                        _stavkap.DatumTransakcije = _datumizvoda;
                        _stavkap.Vlasnik = vlasnik;
                        _stavkap.BrojIzvatka = brojizvatka;
                        uutra++;
                        _stavkap.RedBrStavke = uutra;
                        _stavkap.Vlasnikziroracun = transakcijskiracunvlasnika;
                        lista.Add(_stavkap);
                    }
                }


                slog7 += 1;
                slog5kroz += slog5;
                slog5 = 0;
                result = true;
            }
            else
            {
                result = false;
                Valid = false;
            }

        }

        return result;
    }
/**/
    #region NoviIspisi
    
    private static bool CheckWriteSlog903(string line, ref int slog3, ref int slog7, ref bool Valid, ref string transakcijskiracunvlasnika, ref string vlasnik, ref int brojizvatka, ref DateTime _datumizvoda)
    {
        bool result = false;
        int testint;
        DateTime _datum;

        if (line.Substring(line.Length - 3, 3) == "903"
            //&& int.TryParse(line.Substring(0, 10), out testint)
            //&& line.Substring(10, 8) == "        "
            ////&& line.Substring(63, 5) == "00000"
            ////&& line.Substring(71, 1) == " "
            ////&& line.Substring(106, 3) == "000"
            ////&& line.Substring(109, 2) == "  "
            ////&& line.Substring(111, 3) == "250"
            //&& line.Substring(121, 2) == "N "
            //&& int.TryParse(line.Substring(53, 3), out brojizvatka)
            //&& int.TryParse(line.Substring(114, 7), out testint)
            //&& DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4), out _datum)
            //&& line.Substring(199, 50) == "                                                  "
            )
        {
            //
            int.TryParse(line.Substring(0, 7), out testint);
            int.TryParse(line.Substring(167-1, 3), out brojizvatka);
          //  int.TryParse(line.Substring(114, 7), out testint);

            //ISPRAVAK
            //DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4),
            //                  out _datum);
            //
            
                   DateTime.TryParseExact(line.Substring(173+6-1, 2) + "." + line.Substring(173-1+4, 2) + "." + line.Substring(173-1, 4),
                           "dd.MM.yyyy", provider, DateTimeStyles.None,out _datum);
            
            if ((slog3 - slog7) == 0)
            {
                slog3 += 1;
                //transakcijskiracunvlasnika = line.Substring(114, 7) + "-" + line.Substring(0, 10);
                //string _subs = line.Substring(0, 17);
                //string _substring = _subs.Replace(line.Substring(114, 7), "");
                //if (_substring.Length == 10)
                //{
                //    _subs = _substring.Substring(0, 10);
                //}
                //else
                //{
                //    _subs = line.Substring(0, 10).Substring(0, 10);
                //}
                string strtest = line.Substring(18,21);
                strtest = strtest.Trim(' ');
                //transakcijskiracunvlasnika = line.Substring(39-10-7, 7) + "-" + line.Substring(39-10, 10) ;
                transakcijskiracunvlasnika = strtest.Substring(strtest.Length-10-7, 7) + "-" + strtest.Substring(strtest.Length-10, 10) ;
                vlasnik = line.Substring(43-1, 70);
                vlasnik = vlasnik.TrimEnd(' ');

                _datumizvoda = _datum;

                result = true;
            }
            else
            {
                Valid = false;
            }

        }

        return result;
    }

    private static bool CheckWriteSlog905(string line, PretvoreneStavkeIzvatkaList lista, ref int slog3, ref int slog5, ref int slog7, ref bool Valid, ref string transakcijskiracunvlasnika, ref string vlasnik, ref int brojizvatka, ref DateTime _datumizvoda)
    {
        bool result = false;
        PretvoreneStavkeIzvatka _stavka = new PretvoreneStavkeIzvatka();
        DateTime _datumvalute;
        if (line.Substring(line.Length - 3, 3) == "905" && (slog3 - slog7) == 1
            //&& line.Substring(204, 6) == "100100"
            //&& DateTime.TryParse(line.Substring(210, 2) + "." + line.Substring(212, 2) + "." + line.Substring(214, 4), out _datumvalute)
            //&& line.Substring(218, 1) == " "
            )
        {
            ////
            ////ISPRAVAK
            ////DateTime.TryParse(line.Substring(210, 2) + "." + line.Substring(212, 2) + "." + line.Substring(214, 4),
            ////                  out _datumvalute);
                             DateTime.TryParseExact(
                        line.Substring(177+6-1, 2) + "." + line.Substring(177-1+4, 2) + "." + line.Substring(177-1, 4),
                        "dd.MM.yyyy", provider, DateTimeStyles.None, out _datumvalute);

          
            ////_datumvalute = DateTime.Now;
            ////
            decimal _predznak = 1m;
            if (line.Substring(227-1, 1) == "-")
            {
                _predznak = -1m;
            }
            else if (line.Substring(227-1, 1) == "+")
            {
                _predznak = 1m;
            }
            if (line.Substring(1-1, 2) == "10")
            {
                Decimal _decimal;
                if (Decimal.TryParse(string.Format("{0},{1}", (line.Substring(228-1, 13)), (line.Substring(228-1+13, 2))), NumberStyles.AllowDecimalPoint, new CultureInfo("hr-hr"), out _decimal))
                {
                    _stavka.Dug = _decimal * _predznak;
                }

            }
            else if (line.Substring(1-1, 2) == "20")
            {
                Decimal _decimal;
                if (Decimal.TryParse(string.Format("{0},{1}", (line.Substring(228-1, 13)), (line.Substring(228-1+13, 2))), NumberStyles.AllowDecimalPoint, new CultureInfo("hr-hr"), out _decimal))
                {
                    _stavka.Pot = _decimal * _predznak;
                }
            }
            else
            {
                Valid = false;
                return false;
            }
            _stavka.Vlasnikziroracun = transakcijskiracunvlasnika;
            _stavka.Vlasnik = vlasnik;
            _stavka.BrojIzvatka = brojizvatka;
            string noviformat = line.Substring(3 - 1, 34);
            noviformat = noviformat.TrimEnd(' ');
           // noviformat = noviformat.Trim('-');
            
        
            if (noviformat.Length < 17 && noviformat.Length >=10 && !noviformat.Contains("-"))
            {
                _stavka.VjerovnikDuznikZiroracun = transakcijskiracunvlasnika.Substring(0,7) + "-" + noviformat.Substring(noviformat.Length-10, 10) ;
            }
            else
            {
                  if (noviformat.Length >=17 && !noviformat.Contains("-"))
            {
                _stavka.VjerovnikDuznikZiroracun = noviformat.Substring(noviformat.Length-10-7, 7) + "-" + noviformat.Substring(noviformat.Length-10, 10) ;
            }
                  else
                  {
                      if (noviformat.Contains("-"))
                      {
                          noviformat  = noviformat.Replace("-","");
                          _stavka.VjerovnikDuznikZiroracun = noviformat.Substring(noviformat.Length-10-7, 7) + "-" + noviformat.Substring(noviformat.Length-10, 10) ;
                      }
                      else
                      {
                      _stavka.VjerovnikDuznikZiroracun = "000000-000000000";    
                      }
                      
                  }
            }
              


            //string _subs = line.Substring(2, 17);
            //string _substring = _subs;
            //if (_subs.Substring(0, 7) == line.Substring(197, 7))
            //{
            //    _substring = _subs.Substring(7, _subs.Length - 7);
            //}

            //if (_substring.Length == 10)
            //{
            //    _subs = _substring.Substring(0, 10);
            //}
            //else
            //{
            //    _subs = line.Substring(2, 18).Substring(0, 10);
            //}
            //string vdzr = (line.Substring(197, 7) + "-" + _subs).Trim(' ');
            //_stavka.VjerovnikDuznikZiroracun = vdzr == "-" ? String.Empty : vdzr;
          // _stavka.VjerovnikDuznikZiroracun = line.Substring(36-10-7, 7) + "-" + line.Substring(36-10, 10) ;
            _stavka.VjerovnikDuznikNaziv = line.Substring(37-1, 70).TrimEnd(' ');
            _stavka.DatumTransakcije = _datumizvoda;
            if (_datumvalute < _datumizvoda)
            {
             //  // _datumizvoda = _datumvalute;
                _stavka.DatumTransakcije = _datumvalute;
            }


            _stavka.Model = line.Substring(269-1+2, 2).Trim(' ');
            _stavka.Pozivnabr = line.Substring(269-1+4, 22).Trim(' ');
            //_stavka.Veznaoznaka = line.Substring(126, 2).Trim(' ');
            _stavka.Opis = line.Substring(299-1, 140).Trim(' ');
            //_stavka.BrojZaReklamaciju = line.Substring(165, 32).Trim(' ');
            _stavka.RedBrStavke = slog5 + 1;
            lista.Add(_stavka);
            slog5 += 1;
            result = true;
        }

        return result;
    }
    private static bool CheckWriteSlog907(string line, PretvoreneStavkeIzvatkaList lista, ref int slog3, ref int slog5, ref int slog7, ref string transakcijskiracunvlasnika, ref DateTime _datumizvoda, ref string vlasnik, ref int brojizvatka
        , ref int slog5kroz, ref bool Valid)
    {
        bool result = false;
        DateTime _datum;
        int brojstavaka;
        int Rednibrojgrupe;

        if (line.Substring(line.Length - 1, 1) == "7" && (slog3 - slog7) == 1
            //    && line.Substring(132, 38) == "                                   000"
            //    && line.Substring(172, 3) == "   "
            //&& DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4), out _datum)
            //    && int.TryParse(line.Substring(126, 6), out brojstavaka)
            //    && int.TryParse(line.Substring(122, 4), out Rednibrojgrupe)
         )
        {
            //

            //ISPRAVAK
            //DateTime.TryParse(line.Substring(191, 2) + "." + line.Substring(193, 2) + "." + line.Substring(195, 4),
            //                  out _datum);
            //_datum = DateTime.Now;

                   DateTime.TryParseExact(
                       line.Substring(101+6-1, 2) + "." + line.Substring(101-1+4, 2) + "." + line.Substring(101-1, 4),
                        "dd.MM.yyyy", provider, DateTimeStyles.None, out _datum);

            int.TryParse(line.Substring(255-1, 6), out brojstavaka);
            int.TryParse(line.Substring(251-1, 4), out Rednibrojgrupe);
            //

            if (/*line.Substring(199, 7) + "-" + line.Substring(0, 10)*/
                //  line.Substring(199, 7) + "-" + (line.Substring(0, 17).Replace(line.Substring(199, 7), "")).Substring(0, 10) == transakcijskiracunvlasnika
                //  && 
                vlasnik == line.Substring(25-1, 70).TrimEnd(' ')
                && brojstavaka == slog5
                /*&& Rednibrojgrupe == slog3*/
                //  && _datum == _datumizvoda
                )
            {
                PretvoreneStavkeIzvatka _stavkad = new PretvoreneStavkeIzvatka();
                PretvoreneStavkeIzvatka _stavkap = new PretvoreneStavkeIzvatka();
                Decimal _decimal;
                int uutra = slog5;
                if (Decimal.TryParse(string.Format("{0},{1}", (line.Substring(204-1, 13)), (line.Substring(204-1+13, 2))), NumberStyles.AllowDecimalPoint, new CultureInfo("hr-hr"), out _decimal))
                {
                    if (_decimal != 0m)
                    {
                        decimal _predznak = 1m;
            if (line.Substring(203-1, 1) == "-")
            {
                _predznak = -1m;
            }
            else if (line.Substring(203-1, 1) == "+")
            {
                _predznak = 1m;
            }
                        _stavkad.Pot = _decimal* _predznak;
                        _stavkad.Opis = "Promet D";
                        _stavkad.DatumTransakcije = _datumizvoda;
                        _stavkad.Vlasnik = vlasnik;
                        _stavkad.Vlasnikziroracun = transakcijskiracunvlasnika;
                        _stavkad.BrojIzvatka = brojizvatka;
                        uutra++;
                        _stavkad.RedBrStavke = uutra;
                        lista.Add(_stavkad);
                    }
                }

                if (Decimal.TryParse(string.Format("{0},{1}", (line.Substring(220-1, 13)), (line.Substring(220-1+13, 2))), NumberStyles.AllowDecimalPoint, new CultureInfo("hr-hr"), out _decimal))
                {
                    if (_decimal != 0m)
                    {
                        decimal _predznak = 1m;
                        if (line.Substring(219 - 1, 1) == "-")
                        {
                            _predznak = -1m;
                        }
                        else if (line.Substring(219 - 1, 1) == "+")
                        {
                            _predznak = 1m;
                        }
                        _stavkap.Dug = _decimal*_predznak;
                        _stavkap.Opis = "Promet P";
                        _stavkap.DatumTransakcije = _datumizvoda;
                        _stavkap.Vlasnik = vlasnik;
                        _stavkap.BrojIzvatka = brojizvatka;
                        uutra++;
                        _stavkap.RedBrStavke = uutra;
                        _stavkap.Vlasnikziroracun = transakcijskiracunvlasnika;
                        lista.Add(_stavkap);
                    }
                }


                slog7 += 1;
                slog5kroz += slog5;
                slog5 = 0;
                result = true;
            }
            else
            {
                result = false;
                Valid = false;
            }

        }

        return result;
    }
    #endregion
    /**/
    
    private static bool CheckWriteSlog9(string line, ref int slog3, ref int slog7, ref int slog0, ref int slog9, ref int slog5kroz, ref bool Valid)
    {
        bool result = false;
        int brojstavaka;
        int brojgrupa;
        if (line.Substring(line.Length - 1, 1) == "9" && (slog3 - slog7) == 0 && (slog0 - slog9) == 1
            //&& line.Substring(0, 6) == "00000 "
            //&& line.Substring(13, 7) == "0000000"
            //&& line.Substring(199, 1) == " "
            //&& int.TryParse(line.Substring(20, 5), out brojgrupa)
            //&& int.TryParse(line.Substring(25, 6), out brojstavaka)
            )
        {
            //
            int.TryParse(line.Substring(20, 5), out brojgrupa);
            int.TryParse(line.Substring(25, 6), out brojstavaka);
            //
            if (brojgrupa == slog3 && brojstavaka == slog5kroz + slog3 + slog0 + slog7 + slog9 + 1)
            {
                slog9 += 1;
                result = true;
            }
            else
            {
                Valid = false;
                return false;
            }
        }
        return result;
    }


    public class PretvoreneStavkeIzvatkaList : List<PretvoreneStavkeIzvatka>
    {

    }


    public class PretvoreneStavkeIzvatka : IComparable<PretvoreneStavkeIzvatka>
    {
        private string _vlasnikziroracun;
        private decimal _dug;
        private decimal _pot;
        private string _vlasnik;
        private string _vjerovnikaziroracun;
        private string _vjerovnikNaziv;
        private string _model;
        private string _pozivnabr;
        private string _veznaoznaka;
        private string _opis;
        private DateTime _datumvalute;
        private string _brojzareklamaciju;
        private int _brojizvatka;
        private int _RedBrStavke;

        public int RedBrStavke
        {
            get { return _RedBrStavke; }
            set { _RedBrStavke = value; }
        }

        public decimal Dug
        {
            get { return _dug; }
            set { _dug = value; }
        }
        public string Vlasnik
        {
            get { return _vlasnik; }
            set { _vlasnik = value; }
        }
        public decimal Pot
        {
            get { return _pot; }
            set { _pot = value; }
        }

        public string Vlasnikziroracun
        {
            get { return _vlasnikziroracun; }
            set { _vlasnikziroracun = value; }
        }

        public string VjerovnikDuznikZiroracun
        {
            get { return _vjerovnikaziroracun; }
            set { _vjerovnikaziroracun = value; }
        }

        public string VjerovnikDuznikNaziv
        {
            get { return _vjerovnikNaziv; }
            set { _vjerovnikNaziv = value; }
        }

        public DateTime DatumTransakcije
        {
            get { return _datumvalute; }
            set { _datumvalute = value; }
        }
        public string Model
        {
            get { return _model; }
            set { _model = value; }
        }
        public string Pozivnabr
        {
            get { return _pozivnabr; }
            set { _pozivnabr = value; }
        }
        public string Veznaoznaka
        {
            get { return _veznaoznaka; }
            set { _veznaoznaka = value; }
        }

        public string Opis
        {
            get { return _opis; }
            set { _opis = value; }
        }
        public string BrojZaReklamaciju
        {
            get { return _brojzareklamaciju; }
            set { _brojzareklamaciju = value; }
        }

        public int BrojIzvatka
        {
            get { return _brojizvatka; }
            set { _brojizvatka = value; }
        }

        #region IComparable<Filter> Members

        public int CompareTo(PretvoreneStavkeIzvatka other)
        {
            return Vlasnikziroracun.CompareTo(other.Vlasnikziroracun);
        }

        #endregion
    }

};

